package java学习.第13章_泛型;

import org.junit.Test;

import java.util.*;

/**
 * ClassName: C_通配符
 * Package: java学习.第13章_泛型
 * Description:
 *
 * @Author 张蛟龙
 * @Create 2023/4/6 18:07
 * @Version 1.0
 */
public class D_通配符 {
    @Test
    public void 通配符() {
        /**
         * 通配符 ？
         * 类A是类B的父类，G<A> 和G<B>是没有关系的，二者共同的父类是: G<?>
         */
        List<Object> list =  new ArrayList<>();
        List<String> list1 = new ArrayList<>();
        list1.add("AA");
        list1.add("BB");
        list1.add("CC");
        List<?> list2 = null;//?是根父类
        list2 = list;//可以
        list2 = list1;//可以
        list2.add(null);//只能添加 null 数据  因为?你不知道是什么类型

        System.out.println(list2.get(2));//可以读
        System.out.println(list2);


    }

    @Test
    public void 有限制条件的通配符() {
        /**
         * 有限制条件的通配符的使用
         * 假设Object是最大的  即  父 大于 子
         * ? extends HashMap//(-无穷 - HashMap]  即HashMap  和他的子类都可以赋值给他
         * ? super HashMap//[HashMap - 无穷)     即HashMap  和他的父类都可以赋值给他
         */
        List<? extends HashMap> listEx = new ArrayList<>();
        List<? super HashMap> listSup =new ArrayList<>();


        List<LinkedHashMap> listLi = new ArrayList<>();
        List<HashMap> listHa = new ArrayList<>();
        List<Object> listObj = new ArrayList<>();

        listEx = listLi;//可以赋值
        listEx = listHa;//可以赋值
//        listEx = listObj;//不行

//        listSup = listLi;//不行
        listSup = listHa;//可以赋值
        listSup = listObj;//可以赋值

        HashMap hashMap = listEx.get(0);//读  只能用最大的类型接受
//        LinkedHashMap HashMap1 = listEx.get(0);//编译不通过

        //写  只能用类型最小的写入
        // 而? extends HashMap是(-无穷 - HashMap] 没最小，所以不能单独写入
//        listEx.add(new LinkedHashMap());//报错
//        listEx.add(new HashMap());//报错
//        listEx.add(new Object());//报错
        listEx.add(null);


        Object object = listSup.get(0);//读， Object是最大的类型 所以只能用Object

        //写  只能用类型最小的写入
        // 而? super HashMap是[HashMap - 无穷) 只要是HashMap或它的子类都可以
        listSup.add(new HashMap());
        listSup.add(new LinkedHashMap());
//        listSup.add(new Object());//报错
    }

}
